home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-23 | 3.8 KB | 179 lines | [TEXT/PJMM] |
- unit HQXLists;
- { DeHQX v2.0.0 © Peter Lewis, Aug 1991 }
-
- interface
-
- uses
- MyLists, MyFileSystem;
-
- var
- { Total size in all lists. Set to zero in InitHQXLists. size added in AddFile. }
- size_in_lists: longInt;
- { Total size in all processed files. Set to zero in InitHQXLists. You add any processed bytes }
- size_processed: longInt;
- { Current name being processed }
- processing_name: str63;
-
- procedure InitHQXLists;
- procedure AddFile (vrn: integer; dirID: longInt; name: str63; folder: boolean; size: longInt);
- function AnyInputFiles: boolean;
- procedure StartList;
- function AnyFilesLeft: boolean;
- procedure GetNextFile (var vrn: integer; var dirID: longInt; var name: str63; var folder: boolean);
- procedure FinishFile (del: boolean);
- procedure FinishList (del: boolean);
- procedure FinishHQXLists;
-
- implementation
-
- type
- fileList = record
- Fvrn: integer;
- FdirID: longInt;
- Fsh: stringHandle;
- Ffolder: boolean;
- Fdel: boolean;
- Fsize: longInt;
- end;
- fileListPtr = ^fileList;
- fileListHandle = ^fileListptr;
-
- var
- inlist, outlist: listHead;
- outptr: listItem;
- outflh: fileListHandle;
-
- procedure InitHQXLists;
- begin
- CreateList(inlist);
- CreateList(outlist);
- size_in_lists := 0;
- size_processed := 0;
- processing_name := '';
- end;
-
- procedure DeleteList (var lh: listHead; del: boolean);
- var
- flh: fileListHandle;
- ooe: OSErr;
- begin
- while not IsEmpty(lh) do begin
- DeleteHead(lh, flh);
- if del and flh^^.Fdel then
- ooe := MFSDelete(flh^^.Fvrn, flh^^.FdirID, flh^^.Fsh^^);
- DisposHandle(handle(flh^^.Fsh));
- DisposHandle(handle(flh));
- end;
- end;
-
- procedure FinishHQXLists;
- begin
- DeleteList(inlist, false);
- DestroyList(inlist, false);
- DeleteList(outlist, false);
- DestroyList(outlist, false);
- end;
-
- procedure StartList;
- var
- flh: fileListHandle;
- begin
- while not IsEmpty(inlist) do begin
- DeleteHead(inlist, flh);
- AddTail(outlist, flh);
- end;
- ReturnHead(outlist, outptr);
- end;
-
- procedure FinishList (del: boolean);
- begin
- DeleteList(outlist, del);
- end;
-
- function GetFileLength (vrn: integer; dirID: longInt; name: str63): longInt;
- var
- pb: HParamBlockRec;
- oe: OSErr;
- begin
- with pb do begin
- ioNamePtr := @name;
- ioVRefNum := vrn;
- ioDirID := dirID;
- ioFVersNum := 0;
- ioFDirIndex := 0;
- oe := PBHGetFInfo(@pb, false);
- if oe = noErr then
- GetFileLength := pb.ioFlLgLen
- else
- GetFileLength := 0;
- end;
- end;
-
- procedure AddFile (vrn: integer; dirID: longInt; name: str63; folder: boolean; size: longInt);
- var
- flh, flh2: fileListHandle;
- sh: stringHandle;
- lp: listItem;
- rel: integer;
- begin
- if size < 0 then
- size := GetFileLength(vrn, dirID, name);
- flh := fileListHandle(NewHandle(SizeOf(fileList)));
- sh := NewString(name);
- with flh^^ do begin
- Fvrn := vrn;
- FdirID := dirID;
- Fsh := sh;
- Ffolder := folder;
- Fdel := false;
- Fsize := size;
- end;
- size_in_lists := size_in_lists + size;
- if IsEmpty(inlist) then
- AddTail(inlist, flh)
- else begin
- ReturnTail(inlist, lp);
- repeat
- MoveToPrev(lp);
- Fetch(lp, flh2);
- rel := RelString(flh2^^.Fsh^^, name, false, false);
- until IsHead(lp) or (rel < 0); {Fsh<name}
- if rel < 0 then
- AddAfter(lp, flh)
- else
- AddBefore(lp, flh);
- end;
- end;
-
- procedure GetNextFile (var vrn: integer; var dirID: longInt; var name: str63; var folder: boolean);
- begin
- Fetch(outptr, outflh);
- with outflh^^ do begin
- vrn := Fvrn;
- dirID := FdirID;
- name := Fsh^^;
- processing_name := name;
- folder := Ffolder;
- end;
- end;
-
- procedure FinishFile (del: boolean);
- var
- flh: fileListHandle;
- begin
- outflh^^.Fdel := del;
- MoveToNext(outptr);
- processing_name := '';
- end;
-
- function AnyFilesLeft: boolean;
- begin
- AnyFilesLeft := not IsTail(outptr);
- end;
-
- function AnyInputFiles: boolean;
- begin
- AnyInputFiles := not IsEmpty(inlist);
- end;
-
- end.